Android – 6.0 动态权限

前言

很早就知道Android 6.0新功能动态权限申请,但是一直没接触过,因为特殊权限也没怎么用过。但是最近看到好多文章阐述,一时技痒,就搞搞看。做过之后才知道,掌握这个知识点还是很有必要的,因为在Android 6.0 以上的设备上,一些特殊权限必须是在运行时动态赋予给用户的。如果直接Intent跳转的话,应用直接Crash了。

申请步骤

  • targetSdkVersion >= 32
  • AndroidManifest.xml中申请需要的权限,包括普通权限和特殊权限
  • 开始动态申请权限

​ (1):检查是否有此权限 ContextCompat.checkSelfPermission(),返回整形,和PackageManager.PERMISSION_GRANTED对比,相等则说明有此权限,如果有此权限,完全OK

​ (2):没有此权限,则判断是否需要向用户解释为何申请权限 shouldShowRequestPermissionRationale() ,然后通过ActivityCompat.requestPermissions()方法申请权限,该方法有三个参数,即当前Activity,要申请的权限(字符串数组),requestCode。这样就可以知道一次可以申请多个权限,而requestCode就是用来在第三部回调的时候判断是谁申请了权限。

​ (3):在当前Activity中的onRequestPermissionsResult()方法中处理用户是否授予了此权限。

  1. 在小米5上测试的时候,发现当用户拒绝了权限,之后在点击就不会在弹出提示框,而在原生的Android系统中,拒绝一次之后再次点击,第二次弹出申请权限的对话框中会出现”以后不再弹出“的复选框。参考网上一个比较好的做法是,在再次点击的时候打开当前应用的信息界面,让用户可以手动来赋予权限。代码如下:
1
2
3
4
5
6
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
String pkg = "com.android.settings";
String cls = "com.android.settings.applications.InstalledAppDetails";
intent.setComponent(new ComponentName(pkg, cls));
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
  1. 测试了两个权限,一个是打开相册权限,一个是拨打电话权限,在点击提示框赋予权限之后,可以直接跳转的系统相册界面,但是在赋予通话权限之后,还需要再次点击才能进去通话界面,主要是通电话的Intent不能写入到onRequestPermissionsResult()方法中,提示“ Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with checkPermission) or explicitly handle a potential SecurityException “,这不是开玩笑吗?留个坑吧,待解决。

Demo 地址:

https://github.com/Omooo/DynPermissionsDemo

参考

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1110/3670.html

http://www.jianshu.com/p/a51593817825

http://www.cnblogs.com/dubo-/p/6018262.html

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?